package org.dicr.sys.linux;

import java.io.*;
import java.util.regex.*;

import org.dicr.util.data.*;

/**
 * Системный логин.
 * 
 * @author Igor A Tarasov &lt;java@dicr.org&gt;
 * @version 1.0
 */
public class SysUser implements Serializable {
	private static final long serialVersionUID = 1L;

	/** Password maximum length */
	public static final int NAME_MAXLENGTH = 15;

	/** Name pattern */
	protected static final Pattern NAME_PATTERN = Pattern.compile(String.format("^[a-z0-9\\_\\.]{1,%d}$",
	        Integer.valueOf(NAME_MAXLENGTH)));

	/** Login name. Max length: 15 chars */
	protected String name = null;

	/** Password. If password equals "x", then password is in shasow file. */
	protected String passwd = null;

	/** SysUser ID */
	protected int uid = -1;

	/** SysGroup ID */
	protected int gid = -1;

	/** Full name of user */
	protected String fullName = null;

	/** Home directory */
	protected String homeDir = null;

	/** Shell */
	protected String shell = null;

	/**
	 * Constructor
	 * 
	 * @param usrName имя пользователя (1.. {@value #NAME_MAXLENGTH}).
	 * @param thePasswd пароль пользователя или null.
	 * @param theUID UserID (>=0).
	 * @param theGid GroupID (>=0).
	 * @param theFullName полное имя или null.
	 * @param theHomeDir домашняя директория или null.
	 * @param theShell shell пользователя или null.
	 */
	protected SysUser(String usrName, String thePasswd, int theUID, int theGid, String theFullName, String theHomeDir, String theShell) {
		String theName = StringUtils.normalize(usrName);
		if (theName == null) throw new IllegalArgumentException("empty name");
		if (!NAME_PATTERN.matcher(theName).matches()) throw new IllegalArgumentException("name: " + theName);
		this.name = theName;
		if (theUID < 0) throw new IllegalArgumentException("uid: " + theUID);
		this.uid = theUID;
		if (theGid < 0) throw new IllegalArgumentException("gid:" + theGid);
		this.gid = theGid;
		this.passwd = thePasswd;
		this.homeDir = StringUtils.normalize(theHomeDir);
		this.shell = StringUtils.normalize(theShell);
		this.fullName = StringUtils.normalize(theFullName);
	}

	/**
	 * Возвращает иям пользователя.
	 * 
	 * @return имя пользователя (login).
	 */
	public String getName() {
		return this.name;
	}

	/**
	 * Возвращает пароль пользователя.
	 * 
	 * @return зашифрованный пароль пользователя или null если в shadow.
	 */
	public String getPasswd() {
		return this.passwd;
	}

	/**
	 * Возвращает домашнюю директорию пользователя.
	 * 
	 * @return домашняя директория или null.
	 */
	public String getHomeDir() {
		return this.homeDir;
	}

	/**
	 * Возвращает shell пользователя.
	 * 
	 * @return shell пользователя или null.
	 */
	public String getShell() {
		return this.shell;
	}

	/**
	 * Возвращает SysUser ID.
	 * 
	 * @return UID
	 */
	public int getUid() {
		return this.uid;
	}

	/**
	 * Возвращает SysGroup ID.
	 * 
	 * @return GID
	 */
	public int getGid() {
		return this.gid;
	}

	/**
	 * Возвращает полное имя пользователя.
	 * 
	 * @return полное имя или null.
	 */
	public String getFullName() {
		return this.fullName;
	}

	/**
	 * Преобразует в строку.
	 * 
	 * @return строковое представление.
	 */
	@Override
	public String toString() {
		return "SysUser[" + this.name + "]";
	}
}
